﻿using System;
using System.ComponentModel;
using System.Configuration;
using System.Globalization;

namespace Tencent.OA.App
{
    /// <summary>
    /// <para> 提供一个从类型的完全限定名到这个类型实例的转换器。</para>
    /// </summary>
    public class AssemblyQualifiedTypeNameConverter : ConfigurationConverterBase
    {
        /// <summary>
        /// <para> 默认构造函数。</para>
        /// </summary>
        public AssemblyQualifiedTypeNameConverter()
        {
        }

        /// <summary>
        /// <para> 从一个对象中获取该对象所属的程序集限定名，其中包括从该程序集中加载这个对象的程序集的名称。</para>
        /// </summary>
        /// <param name="context">System.ComponentModel.ITypeDescriptorContext，提供格式上下文。</param>
        /// <param name="culture">System.Globalization.CultureInfo。如果传递 null，则采用当前区域性。</param>
        /// <param name="value">要获取程序集限定名的 System.Object。</param>
        /// <param name="destinationType"><paramref name="value"/> 参数要转换成的 System.Type。</param>
        /// <returns>一个程序集限定名。</returns>
        /// <exception cref="System.ArgumentException"><paramref name="value"/> 不是一个System.Type类型。</exception>
        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if (value != null)
            {
                Type typeValue = value as Type;
                if (typeValue == null)
                {
                    throw new ArgumentException(string.Format("The AssemblyQualifiedTypeNameConverter can only convert values of type '{0}'.", typeof(Type).Name));
                }

                if (typeValue != null)
                    return (typeValue).AssemblyQualifiedName;
            }
            return null;
        }

        /// <summary><para> 使用指定的上下文和区域性信息将给定的对象转换为此转换器的类型。</para>
        /// </summary>
        /// <param name="context">一个 <see cref="System.ComponentModel.ITypeDescriptorContext"/>，提供格式上下文。</param>
        /// <param name="culture">用作当前区域性的 <see cref="System.Globalization.CultureInfo"/>。</param>
        /// <param name="value">要转换的 System.Object。</param>
        /// <returns>表示转换的 value 的 System.Object。</returns>
        /// <exception cref="System.ArgumentException"> 类型的完全限定名称无效。</exception>
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            string stringValue = (string)value;
            if (!string.IsNullOrEmpty(stringValue))
            {
                Type result = Type.GetType(stringValue, false);
                if (result == null)
                {
                    throw new ArgumentException(string.Format("The type '{0}' cannot be resolved. Please verify the spelling is correct or that the full type name is provided.", stringValue));
                }

                return result;
            }
            return null;
        }

    }
}
